home *** CD-ROM | disk | FTP | other *** search
Wrap
package java.util; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; public class TreeMap<K, V> extends AbstractMap<K, V> implements NavigableMap<K, V>, Cloneable, Serializable { private final Comparator<? super K> comparator; private transient Entry<K, V> root = null; private transient int size = 0; private transient int modCount = 0; private transient TreeMap<K, V>.EntrySet entrySet = null; private transient KeySet<K> navigableKeySet = null; private transient NavigableMap<K, V> descendingMap = null; private static final boolean RED = false; private static final boolean BLACK = true; private static final long serialVersionUID = 919286545866124006L; public TreeMap() { this.comparator = null; } public TreeMap(Comparator<? super K> var1) { this.comparator = var1; } public TreeMap(Map<? extends K, ? extends V> var1) { this.comparator = null; this.putAll(var1); } public TreeMap(SortedMap<K, ? extends V> var1) { this.comparator = var1.comparator(); try { this.buildFromSorted(var1.size(), var1.entrySet().iterator(), (ObjectInputStream)null, (Object)null); } catch (IOException var3) { } catch (ClassNotFoundException var4) { } } public int size() { return this.size; } public boolean containsKey(Object var1) { return this.getEntry(var1) != null; } public boolean containsValue(Object var1) { for(Entry var2 = this.getFirstEntry(); var2 != null; var2 = successor(var2)) { if (valEquals(var1, var2.value)) { return true; } } return false; } public V get(Object var1) { Entry var2 = this.getEntry(var1); return (V)(var2 == null ? null : var2.value); } public Comparator<? super K> comparator() { return this.comparator; } public K firstKey() { return (K)key(this.getFirstEntry()); } public K lastKey() { return (K)key(this.getLastEntry()); } public void putAll(Map<? extends K, ? extends V> var1) { int var2 = var1.size(); if (this.size == 0 && var2 != 0 && var1 instanceof SortedMap) { Comparator var3 = ((SortedMap)var1).comparator(); if (var3 == this.comparator || var3 != null && var3.equals(this.comparator)) { ++this.modCount; try { this.buildFromSorted(var2, var1.entrySet().iterator(), (ObjectInputStream)null, (Object)null); } catch (IOException var5) { } catch (ClassNotFoundException var6) { } return; } } super.putAll(var1); } final Entry<K, V> getEntry(Object var1) { if (this.comparator != null) { return this.getEntryUsingComparator(var1); } else if (var1 == null) { throw new NullPointerException(); } else { Comparable var2 = (Comparable)var1; Entry var3 = this.root; while(var3 != null) { int var4 = var2.compareTo(var3.key); if (var4 < 0) { var3 = var3.left; } else { if (var4 <= 0) { return var3; } var3 = var3.right; } } return null; } } final Entry<K, V> getEntryUsingComparator(Object var1) { Object var2 = var1; Comparator var3 = this.comparator; if (var3 != null) { Entry var4 = this.root; while(var4 != null) { int var5 = var3.compare(var2, var4.key); if (var5 < 0) { var4 = var4.left; } else { if (var5 <= 0) { return var4; } var4 = var4.right; } } } return null; } final Entry<K, V> getCeilingEntry(K var1) { Entry var2 = this.root; while(var2 != null) { int var3 = this.compare(var1, var2.key); if (var3 < 0) { if (var2.left == null) { return var2; } var2 = var2.left; } else { if (var3 <= 0) { return var2; } if (var2.right == null) { Entry var4 = var2.parent; for(Entry var5 = var2; var4 != null && var5 == var4.right; var4 = var4.parent) { var5 = var4; } return var4; } var2 = var2.right; } } return null; } final Entry<K, V> getFloorEntry(K var1) { Entry var2 = this.root; while(var2 != null) { int var3 = this.compare(var1, var2.key); if (var3 > 0) { if (var2.right == null) { return var2; } var2 = var2.right; } else { if (var3 >= 0) { return var2; } if (var2.left == null) { Entry var4 = var2.parent; for(Entry var5 = var2; var4 != null && var5 == var4.left; var4 = var4.parent) { var5 = var4; } return var4; } var2 = var2.left; } } return null; } final Entry<K, V> getHigherEntry(K var1) { Entry var2 = this.root; while(var2 != null) { int var3 = this.compare(var1, var2.key); if (var3 < 0) { if (var2.left == null) { return var2; } var2 = var2.left; } else { if (var2.right == null) { Entry var4 = var2.parent; for(Entry var5 = var2; var4 != null && var5 == var4.right; var4 = var4.parent) { var5 = var4; } return var4; } var2 = var2.right; } } return null; } final Entry<K, V> getLowerEntry(K var1) { Entry var2 = this.root; while(var2 != null) { int var3 = this.compare(var1, var2.key); if (var3 > 0) { if (var2.right == null) { return var2; } var2 = var2.right; } else { if (var2.left == null) { Entry var4 = var2.parent; for(Entry var5 = var2; var4 != null && var5 == var4.left; var4 = var4.parent) { var5 = var4; } return var4; } var2 = var2.left; } } return null; } public V put(K var1, V var2) { Entry var3 = this.root; if (var3 == null) { this.root = new Entry(var1, var2, (Entry)null); this.size = 1; ++this.modCount; return null; } else { Comparator var6 = this.comparator; int var4; Entry var5; if (var6 != null) { do { var5 = var3; var4 = var6.compare(var1, var3.key); if (var4 < 0) { var3 = var3.left; } else { if (var4 <= 0) { return (V)var3.setValue(var2); } var3 = var3.right; } } while(var3 != null); } else { if (var1 == null) { throw new NullPointerException(); } Comparable var7 = (Comparable)var1; do { var5 = var3; var4 = var7.compareTo(var3.key); if (var4 < 0) { var3 = var3.left; } else { if (var4 <= 0) { return (V)var3.setValue(var2); } var3 = var3.right; } } while(var3 != null); } Entry var8 = new Entry(var1, var2, var5); if (var4 < 0) { var5.left = var8; } else { var5.right = var8; } this.fixAfterInsertion(var8); ++this.size; ++this.modCount; return null; } } public V remove(Object var1) { Entry var2 = this.getEntry(var1); if (var2 == null) { return null; } else { Object var3 = var2.value; this.deleteEntry(var2); return (V)var3; } } public void clear() { ++this.modCount; this.size = 0; this.root = null; } public Object clone() { Object var1 = null; try { var6 = (TreeMap)super.clone(); } catch (CloneNotSupportedException var5) { throw new InternalError(); } var6.root = null; var6.size = 0; var6.modCount = 0; var6.entrySet = null; var6.navigableKeySet = null; var6.descendingMap = null; try { var6.buildFromSorted(this.size, this.entrySet().iterator(), (ObjectInputStream)null, (Object)null); } catch (IOException var3) { } catch (ClassNotFoundException var4) { } return var6; } public Map.Entry<K, V> firstEntry() { return exportEntry(this.getFirstEntry()); } public Map.Entry<K, V> lastEntry() { return exportEntry(this.getLastEntry()); } public Map.Entry<K, V> pollFirstEntry() { Entry var1 = this.getFirstEntry(); Map.Entry var2 = exportEntry(var1); if (var1 != null) { this.deleteEntry(var1); } return var2; } public Map.Entry<K, V> pollLastEntry() { Entry var1 = this.getLastEntry(); Map.Entry var2 = exportEntry(var1); if (var1 != null) { this.deleteEntry(var1); } return var2; } public Map.Entry<K, V> lowerEntry(K var1) { return exportEntry(this.getLowerEntry(var1)); } public K lowerKey(K var1) { return (K)keyOrNull(this.getLowerEntry(var1)); } public Map.Entry<K, V> floorEntry(K var1) { return exportEntry(this.getFloorEntry(var1)); } public K floorKey(K var1) { return (K)keyOrNull(this.getFloorEntry(var1)); } public Map.Entry<K, V> ceilingEntry(K var1) { return exportEntry(this.getCeilingEntry(var1)); } public K ceilingKey(K var1) { return (K)keyOrNull(this.getCeilingEntry(var1)); } public Map.Entry<K, V> higherEntry(K var1) { return exportEntry(this.getHigherEntry(var1)); } public K higherKey(K var1) { return (K)keyOrNull(this.getHigherEntry(var1)); } public Set<K> keySet() { return this.navigableKeySet(); } public NavigableSet<K> navigableKeySet() { KeySet var1 = this.navigableKeySet; return var1 != null ? var1 : (this.navigableKeySet = new KeySet(this)); } public NavigableSet<K> descendingKeySet() { return this.descendingMap().navigableKeySet(); } public Collection<V> values() { Collection var1 = this.values; return var1 != null ? var1 : (this.values = new Values(this)); } public Set<Map.Entry<K, V>> entrySet() { EntrySet var1 = this.entrySet; return var1 != null ? var1 : (this.entrySet = new EntrySet(this)); } public NavigableMap<K, V> descendingMap() { NavigableMap var1 = this.descendingMap; return var1 != null ? var1 : (this.descendingMap = new DescendingSubMap(this, true, (Object)null, true, true, (Object)null, true)); } public NavigableMap<K, V> subMap(K var1, boolean var2, K var3, boolean var4) { return new AscendingSubMap(this, false, var1, var2, false, var3, var4); } public NavigableMap<K, V> headMap(K var1, boolean var2) { return new AscendingSubMap(this, true, (Object)null, true, false, var1, var2); } public NavigableMap<K, V> tailMap(K var1, boolean var2) { return new AscendingSubMap(this, false, var1, var2, true, (Object)null, true); } public SortedMap<K, V> subMap(K var1, K var2) { return this.subMap(var1, true, var2, false); } public SortedMap<K, V> headMap(K var1) { return this.headMap(var1, false); } public SortedMap<K, V> tailMap(K var1) { return this.tailMap(var1, true); } Iterator<K> keyIterator() { return new KeyIterator(this, this.getFirstEntry()); } Iterator<K> descendingKeyIterator() { return new DescendingKeyIterator(this, this.getFirstEntry()); } final int compare(Object var1, Object var2) { return this.comparator == null ? ((Comparable)var1).compareTo(var2) : this.comparator.compare(var1, var2); } static final boolean valEquals(Object var0, Object var1) { return var0 == null ? var1 == null : var0.equals(var1); } static <K, V> Map.Entry<K, V> exportEntry(Entry<K, V> var0) { return var0 == null ? null : new AbstractMap.SimpleImmutableEntry(var0); } static <K, V> K keyOrNull(Entry<K, V> var0) { return (K)(var0 == null ? null : var0.key); } static <K> K key(Entry<K, ?> var0) { if (var0 == null) { throw new NoSuchElementException(); } else { return (K)var0.key; } } final Entry<K, V> getFirstEntry() { Entry var1 = this.root; if (var1 != null) { while(var1.left != null) { var1 = var1.left; } } return var1; } final Entry<K, V> getLastEntry() { Entry var1 = this.root; if (var1 != null) { while(var1.right != null) { var1 = var1.right; } } return var1; } static <K, V> Entry<K, V> successor(Entry<K, V> var0) { if (var0 == null) { return null; } else if (var0.right != null) { Entry var3; for(var3 = var0.right; var3.left != null; var3 = var3.left) { } return var3; } else { Entry var1 = var0.parent; for(Entry var2 = var0; var1 != null && var2 == var1.right; var1 = var1.parent) { var2 = var1; } return var1; } } static <K, V> Entry<K, V> predecessor(Entry<K, V> var0) { if (var0 == null) { return null; } else if (var0.left != null) { Entry var3; for(var3 = var0.left; var3.right != null; var3 = var3.right) { } return var3; } else { Entry var1 = var0.parent; for(Entry var2 = var0; var1 != null && var2 == var1.left; var1 = var1.parent) { var2 = var1; } return var1; } } private static <K, V> boolean colorOf(Entry<K, V> var0) { return var0 == null ? true : var0.color; } private static <K, V> Entry<K, V> parentOf(Entry<K, V> var0) { return var0 == null ? null : var0.parent; } private static <K, V> void setColor(Entry<K, V> var0, boolean var1) { if (var0 != null) { var0.color = var1; } } private static <K, V> Entry<K, V> leftOf(Entry<K, V> var0) { return var0 == null ? null : var0.left; } private static <K, V> Entry<K, V> rightOf(Entry<K, V> var0) { return var0 == null ? null : var0.right; } private void rotateLeft(Entry<K, V> var1) { if (var1 != null) { Entry var2 = var1.right; var1.right = var2.left; if (var2.left != null) { var2.left.parent = var1; } var2.parent = var1.parent; if (var1.parent == null) { this.root = var2; } else if (var1.parent.left == var1) { var1.parent.left = var2; } else { var1.parent.right = var2; } var2.left = var1; var1.parent = var2; } } private void rotateRight(Entry<K, V> var1) { if (var1 != null) { Entry var2 = var1.left; var1.left = var2.right; if (var2.right != null) { var2.right.parent = var1; } var2.parent = var1.parent; if (var1.parent == null) { this.root = var2; } else if (var1.parent.right == var1) { var1.parent.right = var2; } else { var1.parent.left = var2; } var2.right = var1; var1.parent = var2; } } private void fixAfterInsertion(Entry<K, V> var1) { var1.color = false; while(var1 != null && var1 != this.root && !var1.parent.color) { if (parentOf(var1) == leftOf(parentOf(parentOf(var1)))) { Entry var2 = rightOf(parentOf(parentOf(var1))); if (!colorOf(var2)) { setColor(parentOf(var1), true); setColor(var2, true); setColor(parentOf(parentOf(var1)), false); var1 = parentOf(parentOf(var1)); } else { if (var1 == rightOf(parentOf(var1))) { var1 = parentOf(var1); this.rotateLeft(var1); } setColor(parentOf(var1), true); setColor(parentOf(parentOf(var1)), false); this.rotateRight(parentOf(parentOf(var1))); } } else { Entry var3 = leftOf(parentOf(parentOf(var1))); if (!colorOf(var3)) { setColor(parentOf(var1), true); setColor(var3, true); setColor(parentOf(parentOf(var1)), false); var1 = parentOf(parentOf(var1)); } else { if (var1 == leftOf(parentOf(var1))) { var1 = parentOf(var1); this.rotateRight(var1); } setColor(parentOf(var1), true); setColor(parentOf(parentOf(var1)), false); this.rotateLeft(parentOf(parentOf(var1))); } } } this.root.color = true; } private void deleteEntry(Entry<K, V> var1) { ++this.modCount; --this.size; if (var1.left != null && var1.right != null) { Entry var2 = successor(var1); var1.key = var2.key; var1.value = var2.value; var1 = var2; } Entry var3 = var1.left != null ? var1.left : var1.right; if (var3 != null) { var3.parent = var1.parent; if (var1.parent == null) { this.root = var3; } else if (var1 == var1.parent.left) { var1.parent.left = var3; } else { var1.parent.right = var3; } var1.left = var1.right = var1.parent = null; if (var1.color) { this.fixAfterDeletion(var3); } } else if (var1.parent == null) { this.root = null; } else { if (var1.color) { this.fixAfterDeletion(var1); } if (var1.parent != null) { if (var1 == var1.parent.left) { var1.parent.left = null; } else if (var1 == var1.parent.right) { var1.parent.right = null; } var1.parent = null; } } } private void fixAfterDeletion(Entry<K, V> var1) { while(var1 != this.root && colorOf(var1)) { if (var1 == leftOf(parentOf(var1))) { Entry var3 = rightOf(parentOf(var1)); if (!colorOf(var3)) { setColor(var3, true); setColor(parentOf(var1), false); this.rotateLeft(parentOf(var1)); var3 = rightOf(parentOf(var1)); } if (colorOf(leftOf(var3)) && colorOf(rightOf(var3))) { setColor(var3, false); var1 = parentOf(var1); } else { if (colorOf(rightOf(var3))) { setColor(leftOf(var3), true); setColor(var3, false); this.rotateRight(var3); var3 = rightOf(parentOf(var1)); } setColor(var3, colorOf(parentOf(var1))); setColor(parentOf(var1), true); setColor(rightOf(var3), true); this.rotateLeft(parentOf(var1)); var1 = this.root; } } else { Entry var2 = leftOf(parentOf(var1)); if (!colorOf(var2)) { setColor(var2, true); setColor(parentOf(var1), false); this.rotateRight(parentOf(var1)); var2 = leftOf(parentOf(var1)); } if (colorOf(rightOf(var2)) && colorOf(leftOf(var2))) { setColor(var2, false); var1 = parentOf(var1); } else { if (colorOf(leftOf(var2))) { setColor(rightOf(var2), true); setColor(var2, false); this.rotateLeft(var2); var2 = leftOf(parentOf(var1)); } setColor(var2, colorOf(parentOf(var1))); setColor(parentOf(var1), true); setColor(leftOf(var2), true); this.rotateRight(parentOf(var1)); var1 = this.root; } } } setColor(var1, true); } private void writeObject(ObjectOutputStream var1) throws IOException { var1.defaultWriteObject(); var1.writeInt(this.size); for(Map.Entry var3 : this.entrySet()) { var1.writeObject(var3.getKey()); var1.writeObject(var3.getValue()); } } private void readObject(ObjectInputStream var1) throws IOException, ClassNotFoundException { var1.defaultReadObject(); int var2 = var1.readInt(); this.buildFromSorted(var2, (Iterator)null, var1, (Object)null); } void readTreeSet(int var1, ObjectInputStream var2, V var3) throws IOException, ClassNotFoundException { this.buildFromSorted(var1, (Iterator)null, var2, var3); } void addAllForTreeSet(SortedSet<? extends K> var1, V var2) { try { this.buildFromSorted(var1.size(), var1.iterator(), (ObjectInputStream)null, var2); } catch (IOException var4) { } catch (ClassNotFoundException var5) { } } private void buildFromSorted(int var1, Iterator var2, ObjectInputStream var3, V var4) throws IOException, ClassNotFoundException { this.size = var1; this.root = this.buildFromSorted(0, 0, var1 - 1, computeRedLevel(var1), var2, var3, var4); } private final Entry<K, V> buildFromSorted(int var1, int var2, int var3, int var4, Iterator var5, ObjectInputStream var6, V var7) throws IOException, ClassNotFoundException { if (var3 < var2) { return null; } else { int var8 = (var2 + var3) / 2; Entry var9 = null; if (var2 < var8) { var9 = this.buildFromSorted(var1 + 1, var2, var8 - 1, var4, var5, var6, var7); } Object var10; Object var11; if (var5 != null) { if (var7 == null) { Map.Entry var12 = (Map.Entry)var5.next(); var10 = var12.getKey(); var11 = var12.getValue(); } else { var10 = var5.next(); var11 = var7; } } else { var10 = var6.readObject(); var11 = var7 != null ? var7 : var6.readObject(); } Entry var14 = new Entry(var10, var11, (Entry)null); if (var1 == var4) { var14.color = false; } if (var9 != null) { var14.left = var9; var9.parent = var14; } if (var8 < var3) { Entry var13 = this.buildFromSorted(var1 + 1, var8 + 1, var3, var4, var5, var6, var7); var14.right = var13; var13.parent = var14; } return var14; } } private static int computeRedLevel(int var0) { int var1 = 0; for(int var2 = var0 - 1; var2 >= 0; var2 = var2 / 2 - 1) { ++var1; } return var1; } // $FF: synthetic method static void access$000(TreeMap var0, Entry var1) { var0.deleteEntry(var1); } // $FF: synthetic method static int access$100(TreeMap var0) { return var0.modCount; } // $FF: synthetic method static Comparator access$200(TreeMap var0) { return var0.comparator; } }